#include <iostream>
using namespace std;

/*
    构造函数也可以带默认参数
     1.这个版本的构造函数容易跟其他版本起冲突(产生二义性)
     原因：带默认参数的构造函数，参数可以传递，也可以不传递，所以容易跟其他版本产生冲突
     2.如果带默认参数的构造函数源码写在类的外面--》默认参数就不能再写了

    构造函数的五种表现形式，实际开发中，你选取其中一到两种就可以
    1.默认构造函数
    2.带参数的构造函数
    3.带默认参数的构造函数
    4.带参数列表的构造函数
    5.指定父类的构造函数
*/

class Cat
{
public:
    // Cat() // 默认构造函数
    // {
    //     cout << "Cat()" << endl;
    // }

    // Cat(int age)
    // {
    //     cout << "Cat(int age)" << endl;
    // }

    // Cat(int age, int weight) // 带参数的构造函数
    // {
    //     cout << "Cat(int age, int weight)" << endl;
    // }

    // 构造函数设置默认参数
    // Cat(int age, int weight = 10) // 带默认参数的构造函数  带默认参数的构造函数不能重载
    // {
    //     cout << "Cat(int age, int weight = 10)" << endl;
    // }

    // 带默认参数的构造函数，定义写在类的外面 --》默认参数就不能再写了
    Cat(int age = 10, int weight = 20); // 带默认参数的构造函数  带默认参数的构造函数不能重载

private:
    int age;
    int weight;
};

// 带默认参数的构造函数，定义写在类的外面 --》默认参数就不能再写了
Cat::Cat(int age, int weight)
{
    cout << "Cat(int age = 10, int weight = 20)" << endl;
}

int main()
{
    Cat cat1;         // 调用默认构造函数
    Cat cat2(10);     // 调用带参数的构造函数
    Cat cat3(10, 20); // 调用带默认参数的构造函数
    return 0;
}